Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(auth): use 'Token' as authentication header #7894

Closed
wants to merge 1 commit into from

Conversation

arrio464
Copy link

fix #3829
验证头部可以从‘Authorization’和‘Token’中二选一,避免与basic auth的冲突

@arrio464
Copy link
Author

前端部分的PR:AlistGo/alist-web#242

@xhofe
Copy link
Collaborator

xhofe commented Jan 30, 2025

建议header名用X-Token,并兼容之前的逻辑,优先取X-Token,如果为空再取Authorization

@@ -8,6 +8,7 @@ import (
type Addition struct {
driver.RootPath
Address string `json:"url" required:"true"`
AuthHeader string `json:"auth_header" type:"select" options:"Authorization,X-Token" default:"X-Token"`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的修改需要在init函数中判断下AuthHeader ,如果为空则设置默认值

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢建议!是指在此处修改代码吗?

// drivers/alist_v3/meta.go
func init() {
        op.RegisterDriver(func() driver.Driver {
-               return &AListV3{}
+               d := &AListV3{}
+               if d.Addition.AuthHeader == "" {
+                       d.Addition.AuthHeader = "X-Token"
+               }
+               return d
        })
 }

既然 AuthHeader 已经在结构体中设置了 default:"X-Token",为什么还需要在 init 函数中再次判断是否为空呢?是否为了避免用户未选择或者其他特殊情况?
希望能得到您的进一步解释,非常感谢!

@Mmx233
Copy link
Contributor

Mmx233 commented Feb 5, 2025

我理解你想要同时使用 Basic Auth 进行认证的需求。然而同时使用多种认证方式本身就是不建议的,也是一个很少用到的场景。在这种情况下你应该在进行 Baisc Auth 认证的网关上修改使用的请求头,而不是修改 alist 反向兼容。

Authorization 是 HTTP 协议中定义的一个用于认证的标准头字段(RFC 7235),使用 X-Token 头是不符合规范的,这可能会使新加入的开发者感到困惑。因此我认为把默认请求头修改为 X-Token 是不合适的。

@arrio464
Copy link
Author

arrio464 commented Feb 5, 2025

我理解你想要同时使用 Basic Auth 进行认证的需求。然而同时使用多种认证方式本身就是不建议的,也是一个很少用到的场景。在这种情况下你应该在进行 Baisc Auth 认证的网关上修改使用的请求头,而不是修改 alist 反向兼容。

Authorization 是 HTTP 协议中定义的一个用于认证的标准头字段(RFC 7235),使用 X-Token 头是不符合规范的,这可能会使新加入的开发者感到困惑。因此我认为把默认请求头修改为 X-Token 是不合适的。

感谢指出问题!

Alist 作为一个可 self-hosted 的服务,在某些情况下需要隐藏服务器特征。Basic Auth可以很好的满足这一点,而不仅仅是用于身份验证。
从安全性的角度来说,增加一道验证机制能提供更好的保护,特别是在缺少专业运维的家用环境下,多一道验证机制能提高安全性,降低风险。(本人并非专业运维,说错了也不一定)

我对 Nginx 的了解不深,据我所知,Nginx 似乎并没有提供一个直接的方法来修改 Authorization 头。如果有可行的解决方案,欢迎指正。

X-Token 头确实不符合标准规范,但我不知道是否有更合适的方案。似乎 X-Auth-Token 和 X-Access-Token 也是比较常见的选择,但它们同样不符合标准。如果你有更好的建议,也欢迎分享。

@Mmx233
Copy link
Contributor

Mmx233 commented Feb 5, 2025

X-Token 头确实不符合标准规范,但我不知道是否有更合适的方案。似乎 X-Auth-Token 和 X-Access-Token 也是比较常见的选择,但它们同样不符合标准。如果你有更好的建议,也欢迎分享。

Nginx 不能方便地更换 Header 可以认为是 Nginx 的不足,我们应该去改进 Nginx。而且我想在 Nginx 中应该可以通过,例如 auth_request、临时使用变量存储原头进行置换、使用 lua 脚本,选取这三种中的一个可以实现你需要的修改使用的请求头的需求,而不是无法修改。或者你也可以寻求其他的网关。

对于你说的信息安全的问题,我深感认可。然而实际上,basic auth 在安全性方面不是最佳方案,在密码较弱的情况下无法提供足够的保护甚至可能导致密码泄露。你可以使用一些更现代化的认证方式比如建立 OIDC Server 然后使用 oauth2proxy 作为网关,oauth2proxy 会使用 cookie 存储认证信息而避免冲突。或者你也可以直接使用 tailscale、zerotier 等加密的虚拟私有网络来直接避免暴露到互联网。

@arrio464
Copy link
Author

arrio464 commented Feb 7, 2025

X-Token 头确实不符合标准规范,但我不知道是否有更合适的方案。似乎 X-Auth-Token 和 X-Access-Token 也是比较常见的选择,但它们同样不符合标准。如果你有更好的建议,也欢迎分享。

Nginx 不能方便地更换 Header 可以认为是 Nginx 的不足,我们应该去改进 Nginx。而且我想在 Nginx 中应该可以通过,例如 auth_request、临时使用变量存储原头进行置换、使用 lua 脚本,选取这三种中的一个可以实现你需要的修改使用的请求头的需求,而不是无法修改。或者你也可以寻求其他的网关。

对于你说的信息安全的问题,我深感认可。然而实际上,basic auth 在安全性方面不是最佳方案,在密码较弱的情况下无法提供足够的保护甚至可能导致密码泄露。你可以使用一些更现代化的认证方式比如建立 OIDC Server 然后使用 oauth2proxy 作为网关,oauth2proxy 会使用 cookie 存储认证信息而避免冲突。或者你也可以直接使用 tailscale、zerotier 等加密的虚拟私有网络来直接避免暴露到互联网。

感谢提供建议!

我理解的是basic auth与alist存在命名冲突。basic auth与alist都使用Authorization头来实现鉴权,而Authorization键只能存一个值。此时无论Nginx怎么修改,也无法正确的传递两个请求头(?
#3829 (comment)

Authorization作为basic auth的头部,似乎是RFC 7617规范的一部分,看起来也不是那么容易修改。

在GPT的帮助下,我曾尝试过临时使用变量存储原头进行置换和auth_request两种方式,但工作都不符合预期,因此只能出此下策修改alist的代码了😂

@arrio464
Copy link
Author

arrio464 commented Feb 7, 2025

之前没了解过oauth2proxy,简单看了一下,感觉也是不错的解决方案,将来可以试试看()

@Mmx233
Copy link
Contributor

Mmx233 commented Feb 7, 2025

我理解的是basic auth与alist存在命名冲突。basic auth与alist都使用Authorization头来实现鉴权,而Authorization键只能存一个值。此时无论Nginx怎么修改,也无法正确的传递两个请求头(? #3829 (comment)

Authorization作为basic auth的头部,似乎是RFC 7617规范的一部分,看起来也不是那么容易修改。

在GPT的帮助下,我曾尝试过临时使用变量存储原头进行置换和auth_request两种方式,但工作都不符合预期,因此只能出此下策修改alist的代码了😂

我似乎引用了错误的文档,我应该引用的是 RFC 7235 section-4.2,RFC 7617 是专门描述 Basic Auth 的。除此之外,例如 RFC 7235 还提到 Proxy-Authorization 可以用于代理服务器鉴权、RFC 6750 还提到 Bearer Token 也应放在 Authorization 头中。但这些都不重要,互相引经据典钻一个牛角尖没有意义。我前几条回复的主要内容是在告诉你,无论你使用什么网关,进行什么鉴权,如何处理鉴权,是否会破坏原应用,是否支持以某种方式处理以逗号或分号分隔的头,以及你是否能通过你的网关达成某些需求,都是添加第二层鉴权的你和你的第二层代理网关的问题。Alist 不应为此负责,而特意改到不规范的 Header 上。

这样让人反复表达同一个观点很令人不悦,我引用文档以及提出其他建议是希望你能够理解并认同上述内容,并为你提供一些额外的帮助,而不是希望讨论你的网关好不好改或者 oauth2proxy 好不好用,请不要这样做。

@arrio464
Copy link
Author

arrio464 commented Feb 8, 2025

我理解的是basic auth与alist存在命名冲突。basic auth与alist都使用Authorization头来实现鉴权,而Authorization键只能存一个值。此时无论Nginx怎么修改,也无法正确的传递两个请求头(? #3829 (comment)
Authorization作为basic auth的头部,似乎是RFC 7617规范的一部分,看起来也不是那么容易修改。
在GPT的帮助下,我曾尝试过临时使用变量存储原头进行置换和auth_request两种方式,但工作都不符合预期,因此只能出此下策修改alist的代码了😂

我似乎引用了错误的文档,我应该引用的是 RFC 7235 section-4.2,RFC 7617 是专门描述 Basic Auth 的。除此之外,例如 RFC 7235 还提到 Proxy-Authorization 可以用于代理服务器鉴权、RFC 6750 还提到 Bearer Token 也应放在 Authorization 头中。但这些都不重要,互相引经据典钻一个牛角尖没有意义。我前几条回复的主要内容是在告诉你,无论你使用什么网关,进行什么鉴权,如何处理鉴权,是否会破坏原应用,是否支持以某种方式处理以逗号或分号分隔的头,以及你是否能通过你的网关达成某些需求,都是添加第二层鉴权的你和你的第二层代理网关的问题。Alist 不应为此负责,而特意改到不规范的 Header 上。

这样让人反复表达同一个观点很令人不悦,我引用文档以及提出其他建议是希望你能够理解并认同上述内容,并为你提供一些额外的帮助,而不是希望讨论你的网关好不好改或者 oauth2proxy 好不好用,请不要这样做。

首先,对造成的困扰表示歉意。由于我本身并非专业运维,可能在描述状况时显得啰嗦和找不到重点,带来了不必要的麻烦,我再次诚挚道歉。
其次,非常感谢你能提供标准文档和改进建议。虽然我依旧不太能理解它们,但无疑它们为我指出了改进方向。我将尝试这些方法,以便在安全性和可用性之间达到一个较好的平衡。

无论如何,take it easy,这只是一个普通的技术探讨,没有必要太过严肃😂非常感谢你和xhofe的耐心交流与指导,也希望将来alist可以越来越好!

@arrio464 arrio464 closed this Feb 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Nginx 反代 + auth_basic 时 401 错误
3 participants